package com.xygz.orm;

import com.xygz.orm.constants.ORMConstants;
import com.xygz.orm.enums.FormatType;
import com.xygz.orm.enums.SQLKeywords;
import com.xygz.orm.table.ZTableField;

import java.util.List;

/**
 * SQL 包裹器
 * 这是线程不安全的。
 *
 * @author xiyuan-lgz 2023-11-01 @version v1.0.0 新建与整理
 */
@SuppressWarnings("all")
public interface SQLWrapper extends ORMConstants {
    
    /**
     * 获取ID
     *
     * @return id
     */
    public abstract String getId();
    
    /**
     * 获取已生成的SQl
     *
     * @return SQL 语句
     */
    public abstract String getSQL();
    
    /**
     * 获取sql 参数列表
     *
     * @return 参数列表
     */
    public abstract List<Object> paramList();
    
    // /**
    //  * 输出SQL片段
    //  *
    //  * @param segment SQL 片段
    //  * @return 当前对象
    //  */
    // public abstract SQLWrapper append(String segment);
    //
    // /**
    //  * 输出SQL片段
    //  *
    //  * @param segment  SQL 片段
    //  * @param preSpace appendSpace
    //  * @return 当前对象
    //  */
    // public abstract SQLWrapper append(String segment, boolean preSpace);
    //
    // /**
    //  * 输出SQL片段
    //  *
    //  * @param keywords SQL 关键字
    //  * @return 当前对象
    //  */
    // public abstract SQLWrapper append(SQLKeywords keywords);
    
    /**
     * 获取SQL 长度
     *
     * @return int
     */
    public abstract int getLengthSQL();
    
    /**
     * 获取参数个数
     *
     * @return int
     */
    public abstract int getParamSize();
    
    /**
     * 添加SQL 参数
     *
     * @param value SQL 参数
     * @return 当前对象
     */
    public abstract SQLWrapper addParam(Object value);
    
    /**
     * SQl 格式化
     *
     * @param type 格式化SQl
     * @return 格式化后的SQL
     */
    default String format(FormatType type) {return format(type, paramList());}
    
    public abstract String format(FormatType type, List<Object> list);
    
    
    public abstract boolean isEmpty();
    
    /**
     * 仅针对 insert 有效 是否自动填充 自增值
     *
     * @return true|false
     */
    public abstract boolean hasAutoKey();
    
    public abstract void setAutoKey(ZTableField autoKey);
    
    public abstract ZTableField getAutoKey();
    
    public abstract SQLKeywords getType();
    
    public abstract SQLWrapper setType(SQLKeywords flag);
    
    /**
     * 重置参数
     */
    public abstract void reset();
    //
    // public abstract boolean hasGroupBy();
    // public abstract SQLWrapper setGroupBy(boolean has);
    //
    // protected abstract int getSelectLastColumnOffset();
    //
    // protected abstract int setSelectLastColumnOffset(int offset);
}
